import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class Exec {
    public static void main(String[] args) throws IOException {
        // Runtime 在 JVM 中是一个单例
        Runtime runtime = Runtime.getRuntime();
        // Process 就表示 "进程"
        Process process = runtime.exec("javac");
        // 获取到子进程的标准输出和标准错误, 把这里的内容写入到两个文件中.
        // 获取标准输出, 从这个文件对象中读, 就能把子进程的标准输出给读出来!
        InputStream stdoutFrom = process.getInputStream();
        FileOutputStream stdoutTo = new FileOutputStream("stdout.txt");
        while (true) {
            int ch = stdoutFrom.read();
            if (ch == -1) {
                break;
            }
            stdoutTo.write(ch);
        }
        stdoutFrom.close();
        stdoutTo.close();
    }
    public static void main2(String[] args) throws IOException {
        // Runtime在JVM中是一个单例模式
        Runtime runtime = Runtime.getRuntime();
        //process本身就有进程的意思,这个关键词用来接收进程
        //javac是一个控制台程序
        //它的输出是输出到一个标准输出和标准错误的两个特殊的文件中
        //要想看到这个程序的运行效果,
        //就要获取标准输出和标准错误的两个特殊的文件中
        //子进程没有和idea终端进行关联
        //代码中手动获取进行关联
        Process process = runtime.exec("javac");
        //获取标准输出和标准错误,然后写入文件中
        //以读的形式打开
        InputStream from = process.getInputStream();
        FileOutputStream to = new FileOutputStream("stdout.txt");
        while(true){
            int ch = from.read();
            if(ch == -1){
                break;
            }
            to.write(ch);
        }
        from.close();
        to.close();
        InputStream stderrFrom = process.getErrorStream();
        FileOutputStream stderrTo = new FileOutputStream("stderr.txt");
        while (true) {
            int ch = stderrFrom.read();
            if (ch == -1) {
                break;
            }
            stderrTo.write(ch);
        }
        stderrFrom.close();
        stderrTo.close();
    }
    //创建一个子进程,让子进程去执行命令
    public static void main1(String[] args) throws IOException {
        // Runtime在JVM中是一个单例模式
        Runtime runtime = Runtime.getRuntime();
        //process本身就有进程的意思,这个关键词用来接收进程
        //直接这样运行好像没有什么反应
        //执行下面的代码就相当于在cmd里面输入了一个指令
        Process process = runtime.exec("javac");

    }
}
